home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 011 / brutil.arc / FILES.ASM < prev    next >
Encoding:
Assembly Source File  |  1988-06-02  |  10.8 KB  |  765 lines

  1.     IF1
  2.     INCLUDE OPTMAC.LIB
  3.     ENDIF
  4.     GENOPT    ASDNORP
  5.     GENOPT    TX
  6. FOPT    EQU    POPT XOR DOPT XOR SOPT XOR ROPT XOR AOPT
  7. LF    EQU    0AH
  8. CR    EQU    0DH
  9.  
  10. CODE    SEGMENT
  11.     ASSUME    CS:CODE,DS:CODE
  12.     ORG    100H
  13. START:    JMP    L023C
  14. OPFLAG    DB    0
  15. LINECT    DB    0
  16. CURLIN    DB    0
  17. OPFLG2    DB    0
  18. DIRFLAG DB    0
  19. FILECT    DW    0
  20. TOTSIZ    DW    0,0
  21. TOTRSZ    DW    0,0
  22. ROUNDER DW    0
  23. L01C0    DB    'Needs DOS 2.0 +$'
  24. L01EB    DB    'Incorrect File Spec$'
  25. L0205    DB    9,' ,;=',CR
  26. L0213    DB    '    $'
  27. L0218    DB    ' Arc$'
  28.     DB    ' Dir$'
  29.     DB    ' Vol$'
  30.     DB    ' Sys$'
  31.     DB    ' Hid$'
  32.     DB    ' R-O$'
  33. DTAFLAG DB    0
  34. DOTFLAG DB    0
  35. DDFLAG    DB    0
  36. FFLAG    DB    1
  37. AMBFLAG DB    0
  38. MYDATE    DB    ' '
  39. MYCC    DW    ?
  40. MYYY    DW    ?
  41.     DB    '-'
  42. MYMO    DW    ?
  43.     DB    '-'
  44. MYDD    DW    ?
  45. MYTIME    DB    ' '
  46. MYHH    DW    ?
  47.     DB    ':'
  48. MYMI    DW    ?
  49.     DB    ':'
  50. MYSS    DW    ?
  51.     DB    '$'
  52.     DB    ' '
  53. MYSIZE    DB    9 DUP(?)
  54.     DB    '$ '
  55. MYRSZE    DB    9 DUP(?)
  56.     DB    'K$'
  57. L0238    DW    ?
  58. L023A    DW    ?
  59. L023C:    MOV    AH,30H
  60.     INT    21H
  61.     CMP    AL,2
  62.     JNB    L024D
  63.     MOV    DX,OFFSET L01C0
  64. L0247:    MOV    AH,9
  65.     INT    21H
  66.     MOV    AX,4C02H
  67.     INT    21H
  68. L024D:    MOV    SI,81H
  69.     MOV    AX,CS
  70.     MOV    SS,AX
  71.     MOV    SP,OFFSET LOCAL_STACK
  72.     MOV    DS,AX
  73.     MOV    ES,AX
  74.     MOV    BX,OFFSET LOCAL_STACK+15
  75.     MOV    CL,4
  76.     SHR    BX,CL
  77.     MOV    AH,4AH
  78.     INT    21H
  79.     JNC    NOALCERR
  80.     MOV    DX,OFFSET MSG1
  81.     MOV    AH,9
  82.     INT    21H
  83.     INT    20H
  84. NOALCERR:
  85.     MOV    CX,5
  86.     CALL    L0251
  87.     DEC    SI
  88.     MOV    L0238,SI
  89.     MOV    DI,OFFSET (L0373+43)
  90.     CMP    BYTE PTR 1[SI],':'
  91.     JZ    NOTDEF
  92.     MOV    AH,25
  93.     INT    21H
  94.     ADD    AL,'A'
  95.     MOV    AH,':'
  96.     JMP    SHORT GOTDEF
  97. NOTDEF: LODSW
  98. GOTDEF: STOSW
  99.     PUSH    AX
  100.     MOV    DL,AL
  101.     AND    DL,1FH
  102.     MOV    AH,54
  103.     INT    21H
  104.     SUB    DX,DX
  105.     MUL    CX
  106.     DEC    AX
  107.     MOV    ROUNDER,AX
  108.     MOV    AL,[SI]
  109.     MOV    [DI],AL
  110.     CMP    AL,'\'
  111.     POP    AX
  112.     JZ    L029E
  113.     MOV    BYTE PTR [DI],'\'
  114.     INC    DI
  115.     MOV    BYTE PTR [DI],0
  116.     PUSH    SI
  117.     MOV    SI,DI
  118.     SUB    AL,'@'
  119.     MOV    DL,AL
  120.     MOV    AH,71
  121.     INT    21H
  122.     POP    SI
  123.     CMP    BYTE PTR [DI],0
  124.     JZ    NOPATH
  125.     XCHG    SI,DI
  126. BYPATH: LODSB
  127.     OR    AL,AL
  128.     JNZ    BYPATH
  129.     XCHG    SI,DI
  130. NOPATH: DEC    DI
  131.     MOV    AL,'\'
  132.     STOSB
  133.     MOV    L023A,DI
  134. L029E:    LODSB
  135.     STOSB
  136.     PUSH    DI
  137.     MOV    DI,OFFSET L0205
  138.     MOV    CX,6
  139.     REPNZ    SCASB
  140.     POP    DI
  141.     JNZ    CHKOPT
  142.     JMP    L02CA
  143. CHKOPT: CMP    AL,'/'
  144.     JNZ    NOOPT
  145.     JMP    GOTOPT
  146. NOOPT:    CMP    AL,'\'
  147.     JZ    L02C8
  148.     CMP    AL,'*'
  149.     JZ    L02C9
  150.     CMP    AL,'?'
  151.     JZ    L02C9
  152.     CMP    AL,'.'
  153.     JZ    GOTDOT
  154. COMDOT: MOV    DTAFLAG,1
  155.     JMP    L029E
  156. GOTDOT: MOV    DOTFLAG,AL
  157.     CMP    BYTE PTR [SI],'.'
  158.     JZ    TWODOT
  159.     CMP    DTAFLAG,0
  160.     JNZ    L029E
  161.     PUSH    SI
  162.     MOV    AH,'*'
  163. ADDIN:    MOV    -1[SI],AH
  164.     MOV    AH,AL
  165.     LODSB
  166.     CMP    AL,13
  167.     JNZ    ADDIN
  168.     XCHG    AH,AL
  169.     MOV    -1[SI],AX
  170.     POP    SI
  171.     INC    SI
  172.     DEC    DI
  173.     MOV    AX,'.*'
  174.     STOSW
  175. L02C9:    MOV    AMBFLAG,AL
  176.     JMP    COMDOT
  177. TWODOT: CMP    DTAFLAG,0
  178.     JNZ    BD1
  179.     INC    SI
  180.     CALL    GETBAK
  181.     JC    BD1
  182.     CALL    GETBAK
  183.     JC    BD1
  184.     MOV    L023A,DI
  185.     MOV    DDFLAG,1
  186.     JMP    COMDOT
  187. BD1:    JMP    L02E8
  188. L02C8:    MOV    L023A,DI
  189.     MOV    DTAFLAG,0
  190.     MOV    DOTFLAG,0
  191.     MOV    DDFLAG,0
  192.     MOV    AMBFLAG,0
  193.     JMP    L029E
  194. GOTOPT: PUSH    SI
  195. GOTOP1: LODSB
  196.     AND    AL,5FH
  197.     CMP    AL,'B'
  198.     JZ    SETB
  199.     CMP    AL,'C'
  200.     JZ    SETC
  201.     TESTOP    ASDNORPF,SETA
  202.     TESTOP    TX,SETT
  203.     CALL    TSTVAL
  204.     MOV    AH,AL
  205. NXTLCT: LODSB
  206.     CMP    AL,'/'
  207.     JZ    SETLCT
  208.     CMP    AL,13
  209.     JZ    SETLCT
  210.     CALL    TSTVAL
  211.     MOV    BH,AH
  212.     ADD    AH,AH
  213.     ADD    AH,AH
  214.     ADD    AH,BH
  215.     ADD    AH,AH
  216.     ADD    AH,AL
  217.     JMP    NXTLCT
  218. SETLCT: MOV    LINECT,AH
  219.     MOV    CURLIN,AH
  220.     DEC    SI
  221.     JMP    SHORT NEXTOPT
  222. BADOPT: MOV    DX,OFFSET BOM1
  223.     JMP    L0247
  224. SETB:    XOR    DIRFLAG,0FFH
  225.     JMP    SHORT NEXTOPT
  226. SETC:    MOV    OPFLAG,0
  227.     MOV    DIRFLAG,0
  228.     JMP    SHORT NEXTOPT
  229. SETA:    XOR    OPFLAG,AH
  230.     JMP    SHORT NEXTOPT
  231. SETT:    XOR    OPFLG2,AH
  232.     JMP    SHORT NEXTOPT
  233. BOM1    DB    'Bad option selected',CR,LF,'$'
  234. TSTVAL: DEC    SI
  235.     LODSB
  236.     SUB    AL,'0'
  237.     JB    BADOPT
  238.     CMP    AL,9
  239.     JA    BADOPT
  240.     RET
  241. NEXTOPT:
  242.     LODSB
  243.     CMP    AL,'/'
  244.     JNZ    GOTOP2
  245.     JMP    GOTOP1
  246. GOTOP2: MOV    AL,NOPT+OOPT
  247.     AND    AL,OPFLAG
  248.     CMP    AL,NOPT+OOPT
  249.     JNZ    L02CB
  250.     XOR    OPFLAG,AL
  251. L02CB:    POP    SI
  252. L02CA:
  253.     DEC    SI
  254.     DEC    DI
  255.     CMP    DTAFLAG,0
  256.     JZ    NOCDIR
  257.     CMP    DIRFLAG,0
  258.     JNZ    NOCDIR
  259.     CMP    AMBFLAG,0
  260.     JNZ    NOCDIR
  261.     MOV    BYTE PTR [SI],0
  262.     MOV    DX,L0238
  263.     MOV    AX,4300H
  264.     INT    21H
  265.     TEST    CX,10H
  266.     JZ    NOCDIR
  267.     MOV    BYTE PTR [SI],'\'
  268.     MOV    BYTE PTR 1[SI],13
  269.     MOV    DTAFLAG,0
  270.     MOV    DOTFLAG,0
  271.     MOV    DDFLAG,0
  272.     JMP    L024D
  273. NOCDIR: CMP    DTAFLAG,0
  274.     JNZ    NODTA
  275.     MOV    AL,'*'
  276.     STOSB
  277.     MOV    [SI],AL
  278.     INC    SI
  279. NODTA:    CMP    DOTFLAG,0
  280.     JNZ    NODOT
  281.     MOV    AX,'*.'
  282.     STOSW
  283.     MOV    [SI],AX
  284.     INC    SI
  285.     INC    SI
  286. NODOT:    SUB    AL,AL
  287.     STOSB
  288.     MOV    [SI],AL
  289.     MOV    DX,OFFSET L0373
  290.     MOV    AH,26
  291.     INT    21H
  292.     MOV    DX,L0238
  293.     MOV    CX,1FH
  294.     MOV    AH,4EH
  295. L02DC:    INT    21H
  296.     JNB    L02EE
  297.     CMP    AX,18
  298.     JNZ    L02E8
  299.     JMP    L0366
  300. L02E8:    MOV    DX,OFFSET L01EB
  301.     JMP    L0247
  302. L02EE:
  303.     TEST    OPFLAG,NOPT+OOPT
  304.     JZ    L02EF
  305.     TEST    OPFLAG,NOPT
  306.     JNZ    L02EG
  307.     TEST    BYTE PTR (L0373+21),18H
  308.     JNZ    NO3611
  309.     JMP    L0361
  310. NO3611: JMP    SHORT    L02EF
  311. L02EG:
  312.     TEST    BYTE PTR (L0373+21),18H
  313.     JZ    L02EF
  314.     JMP    L0361
  315. L02EF:    MOV    SI,OFFSET (L0373+30)
  316.     CMP    BYTE PTR [SI],'.'
  317.     JNZ    L03612
  318.     JMP    L0361
  319. L03612: MOV    FFLAG,0
  320.     ADD    FILECT,1
  321.     MOV    AX,WORD PTR (L0373+26)
  322.     MOV    DX,WORD PTR (L0373+28)
  323.     ADD    TOTSIZ,AX
  324.     ADC    TOTSIZ+2,DX
  325.     ADD    AX,ROUNDER
  326.     ADC    DX,0
  327.     OR    AX,ROUNDER
  328.     XOR    AX,ROUNDER
  329.     ADD    TOTRSZ,AX
  330.     ADC    TOTRSZ+2,DX
  331.     TEST    OPFLG2,XOPT
  332.     JZ    L03613
  333.     JMP    L0361
  334. L03613:
  335.     MOV    DI,L023A
  336.     TEST    OPFLAG,POPT
  337.     JZ    NOPDSP
  338.     PUSH    SI
  339.     MOV    CX,DI
  340.     MOV    SI,OFFSET (L0373+43)
  341.     SUB    CX,SI
  342. DPLP:    LODSB
  343.     CALL    L0368
  344.     LOOP    DPLP
  345.     POP    SI
  346. NOPDSP: MOV    CX,12
  347. L0300:    LODSB
  348.     STOSB
  349.     OR    AL,AL
  350.     JZ    L030B
  351.     CALL    L0368
  352.     LOOP    L0300
  353. L030B:
  354.     TEST    OPFLAG,FOPT-POPT
  355.     JZ    L0351
  356.     TEST    OPFLAG,POPT
  357.     JZ    NOPOPT2
  358.     CALL    CRLF
  359.     MOV    CX,1
  360. NOPOPT2:
  361.     OR    CX,CX
  362.     JZ    L030DB
  363.     CALL    DSPSPA
  364. L030DB:
  365.     TEST    OPFLAG,DOPT
  366.     JZ    NODATE
  367.     CALL    DSPDAT
  368. NODATE:
  369.     TEST    OPFLAG,ROPT
  370.     JZ    NORSZE
  371.     CALL    DSPRSZ
  372. NORSZE:
  373.     TEST    OPFLAG,SOPT
  374.     JZ    NOSIZE
  375.     CALL    DSPSIZ
  376. NOSIZE:
  377.     TEST    OPFLAG,AOPT
  378.     JZ    L0351
  379.     CALL    DSPATT
  380. L0351:
  381.     CALL    CRLF
  382. L0361:    MOV    AH,4FH
  383.     JMP    L02DC
  384. GETBAK: DEC    DI
  385.     CMP    BYTE PTR [DI],'\'
  386.     JZ    GBXIT
  387.     CMP    BYTE PTR [DI],':'
  388.     JNZ    GETBAK
  389.     STC
  390. GBXIT:    RET
  391. DSPSPA: MOV    AL,' '
  392. L030D:
  393.     CALL    L0368
  394.     LOOP    L030D
  395.     RET
  396. DSPDAT: MOV    DX,WORD PTR (L0373+24)
  397.     MOV    AX,DX
  398.     MOV    BH,10
  399.     AND    AX,31
  400.     DIV    BH
  401.     ADD    AX,3030H
  402.     MOV    MYDD,AX
  403.     MOV    AX,DX
  404.     MOV    CL,5
  405.     SHR    AX,CL
  406.     AND    AX,15
  407.     DIV    BH
  408.     ADD    AX,3030H
  409.     MOV    MYMO,AX
  410.     MOV    AX,DX
  411.     MOV    CL,9
  412.     SHR    AX,CL
  413.     ADD    AX,1980
  414.     SUB    DX,DX
  415.     MOV    CX,100
  416.     DIV    CX
  417.     DIV    BH
  418.     ADD    AX,3030H
  419.     MOV    MYCC,AX
  420.     MOV    AX,DX
  421.     DIV    BH
  422.     ADD    AX,3030H
  423.     MOV    MYYY,AX
  424.     MOV    DX,WORD PTR (L0373+22)
  425.     MOV    AX,DX
  426.     AND    AX,31
  427.     ROL    AX,1
  428.     DIV    BH
  429.     ADD    AX,3030H
  430.     MOV    MYSS,AX
  431.     MOV    AX,DX
  432.     MOV    CL,5
  433.     SHR    AX,CL
  434.     AND    AX,63
  435.     DIV    BH
  436.     ADD    AX,3030H
  437.     MOV    MYMI,AX
  438.     MOV    AX,DX
  439.     MOV    CL,11
  440.     SHR    AX,CL
  441.     DIV    BH
  442.     ADD    AX,3030H
  443.     MOV    MYHH,AX
  444.     MOV    DX,OFFSET MYDATE
  445.     MOV    AH,9
  446.     INT    21H
  447.     RET
  448. DSPSIZ: MOV    AX,WORD PTR (L0373+26)
  449.     MOV    DX,WORD PTR (L0373+28)
  450.     MOV    DI,OFFSET MYSIZE
  451.     CALL    SENDIT
  452.     MOV    DX,OFFSET MYSIZE-1
  453.     TEST    BYTE PTR (L0373+21),18H
  454.     JZ    RSCOM
  455.     MOV    MYSIZE+8,' '
  456. RSCOM:    MOV    AH,9
  457.     INT    21H
  458.     RET
  459. DSPRSZ: MOV    AX,WORD PTR (L0373+26)
  460.     MOV    DX,WORD PTR (L0373+28)
  461.     ADD    AX,ROUNDER
  462.     ADC    DX,0
  463.     OR    AX,ROUNDER
  464.     XOR    AX,ROUNDER
  465.     ADD    AX,1023
  466.     ADC    DX,0
  467.     MOV    CX,10
  468. GETK:    SHR    DX,1
  469.     RCR    AX,1
  470.     LOOP    GETK
  471.     MOV    DI,OFFSET MYRSZE
  472.     CALL    SENDIT
  473.     MOV    DX,OFFSET MYRSZE+2
  474.     MOV    BYTE PTR MYRSZE+9,'K'
  475.     TEST    BYTE PTR (L0373+21),18H
  476.     JZ    RSCOM
  477.     MOV    WORD PTR MYRSZE+8,'  '
  478.     JMP    RSCOM
  479. SENDIT: MOV    BX,10000
  480.     DIV    BX
  481.     PUSH    AX
  482.     PUSH    DX
  483.     MOV    AX,'  '
  484.     STOSW
  485.     STOSW
  486.     POP    AX
  487.     PUSH    DI
  488.     CALL    DSPVAL
  489.     POP    DI
  490.     POP    AX
  491.     OR    AX,AX
  492.     JZ    DVXIT
  493.     PUSH    AX
  494.     MOV    SI,DI
  495. FILLX:    LODSB
  496.     CMP    AL,' '
  497.     JNZ    NOFILL
  498.     MOV    BYTE PTR -1[SI],'0'
  499.     JMP    FILLX
  500. NOFILL: POP    AX
  501.     JMP    SHORT DVLP
  502. DSPVAL: PUSH    AX
  503.     MOV    AX,'  '
  504.     STOSW
  505.     STOSW
  506.     MOV    BYTE PTR [DI],'0'
  507.     POP    AX
  508. DVLP:    OR    AX,AX
  509.     JNZ    DSPDIG
  510. DVXIT:    RET
  511. DSPDIG: CALL    DIV10
  512.     MOV    [DI],DL
  513.     DEC    DI
  514.     JMP    DVLP
  515. DIV10:    SUB    DX,DX
  516.     MOV    BX,10
  517.     DIV    BX
  518.     OR    DL,30H
  519.     RET
  520. DSPATT: MOV    CL,BYTE PTR (L0373+21)
  521.     OR    CL,CL
  522.     JZ    DSPXIT
  523.     MOV    BL,CL
  524.     SHL    BL,1
  525.     SHL    BL,1
  526.     MOV    CX,6
  527.     MOV    DX,OFFSET L0218
  528. L0345:    PUSH    DX
  529.     SHL    BL,1
  530.     JB    L034D
  531.     MOV    DX,OFFSET L0213
  532. L034D:    MOV    AH,9
  533.     INT    21H
  534.     POP    DX
  535.     ADD    DX,5
  536.     LOOP    L0345
  537. DSPXIT: RET
  538. CRLF:    MOV    AL,CR
  539.     CALL    L0368
  540.     MOV    AL,LF
  541.     CALL    L0368
  542.     CMP    LINECT,0
  543.     JZ    XCRLF
  544.     DEC    CURLIN
  545.     JNZ    XCRLF
  546.     MOV    AH,LINECT
  547.     MOV    CURLIN,AH
  548.     MOV    AH,7
  549.     INT    21H
  550.     CMP    AL,3
  551.     JZ    L0366
  552.     AND    AL,5FH
  553.     CMP    AL,'S'
  554.     JNZ    XCRLF
  555.     JMP    SHELL
  556. XCRLF:    RET
  557. L0366:
  558.     MOV    LINECT,0
  559.     TEST    OPFLG2,TOPT+XOPT
  560.     JNZ    NOL03614
  561.     JMP    L03614
  562. NOL03614:
  563.     MOV    CX,12
  564.     MOV    AX,FILECT
  565.     MOV    DX,0
  566.     MOV    DI,OFFSET MYSIZE
  567.     CALL    SENDIT
  568.     MOV    SI,OFFSET MYSIZE-1
  569. L0500:    LODSB
  570.     CMP    AL,' '
  571.     JZ    L0500
  572.     CMP    AL,'$'
  573.     JZ    L050B
  574.     CALL    L0368
  575.     LOOP    L0500
  576. L050B:
  577.     TEST    OPFLAG,FOPT-POPT
  578.     JZ    NOSIZE2
  579.     TEST    OPFLAG,POPT
  580.     JZ    NOPOPT3
  581.     CALL    CRLF
  582.     MOV    CX,1
  583. NOPOPT3:
  584.     OR    CX,CX
  585.     JZ    L050DB
  586.     CALL    DSPSPA
  587. L050DB:
  588.     TEST    OPFLAG,DOPT
  589.     JZ    NODATE2
  590.     MOV    CX,20
  591.     CALL    DSPSPA
  592. NODATE2:
  593.     TEST    OPFLAG,ROPT
  594.     JZ    NORSZE2
  595.     MOV    MYRSZE+9,'K'
  596.     MOV    AX,TOTRSZ
  597.     MOV    DX,TOTRSZ+2
  598.     ADD    AX,1023
  599.     ADC    DX,0
  600.     MOV    CX,10
  601. GETK2:    SHR    DX,1
  602.     RCR    AX,1
  603.     LOOP    GETK2
  604.     MOV    DI,OFFSET MYRSZE
  605.     CALL    SENDIT
  606.     MOV    DX,OFFSET (MYRSZE+2)
  607.     MOV    AH,9
  608.     INT    21H
  609. NORSZE2:
  610.     TEST    OPFLAG,SOPT
  611.     JZ    NOSIZE2
  612.     MOV    AX,TOTSIZ
  613.     MOV    DX,TOTSIZ+2
  614.     MOV    DI,OFFSET MYSIZE
  615.     CALL    SENDIT
  616.     MOV    DX,OFFSET (MYSIZE-1)
  617.     MOV    AH,9
  618.     INT    21H
  619. NOSIZE2:
  620.     CALL    CRLF
  621. L03614:
  622.     MOV    AL,FFLAG
  623.     MOV    AH,76
  624.     INT    21H
  625. L0368:    PUSH    AX
  626.     PUSH    DX
  627.     MOV    DL,AL
  628.     MOV    AH,2
  629.     INT    21H
  630.     POP    DX
  631.     POP    AX
  632.     RET
  633. L0251:    LODSB
  634.     MOV    DI,OFFSET L0205
  635.     PUSH    CX
  636.     REPNZ    SCASB
  637.     POP    CX
  638.     JZ    L0251
  639.     RET
  640. SHELL:    PUSH    AX
  641.     PUSH    BX
  642.     PUSH    CX
  643.     PUSH    DX
  644.     PUSH    SI
  645.     PUSH    DI
  646.     PUSH    BP
  647.     MOV    AH,47
  648.     INT    21H
  649.     PUSH    BX
  650.     MOV    STKPTR,SP
  651.     MOV    AX,CS
  652.     MOV    PARBLK+4,AX
  653.     MOV    PARBLK+8,AX
  654.     MOV    PARBLK+12,AX
  655.     MOV    DX,OFFSET MSG4
  656.     MOV    AH,9
  657.     INT    21H
  658.     MOV    CX,L023A
  659.     MOV    SI,OFFSET (L0373+43)
  660.     MOV    DI,OFFSET (CMDDTA+1)
  661.     SUB    CX,SI
  662.     PUSH    CX
  663.     CALL    SENDEM
  664.     MOV    SI,OFFSET (L0373+30)
  665.     MOV    CX,12
  666.     CALL    SENDEM
  667.     MOV    BYTE PTR [DI],CR
  668.     MOV    AX,12
  669.     SUB    AX,CX
  670.     POP    CX
  671.     ADD    AX,CX
  672.     MOV    CMDDTA,AL
  673.     MOV    DX,OFFSET CMDBUF
  674.     MOV    AH,10
  675.     INT    21H
  676.     MOV    DL,LF
  677.     MOV    AH,2
  678.     INT    21H
  679.     MOV    AL,CMDDTA
  680.     MOV    CMDLIN,AL
  681.     OR    AL,AL
  682.     JZ    NOSETUP
  683.     MOV    SI,OFFSET PREFMSG
  684.     MOV    DI,OFFSET CMDLIN
  685.     ADD    AL,4
  686.     STOSB
  687.     MOVSW
  688.     MOVSW
  689. NOSETUP:
  690.     MOV    AX,DS:[2CH]
  691.     MOV    DS,AX
  692.     MOV    SI,0
  693.     MOV    DI,OFFSET COMSPEC
  694. LOOP1:    PUSH    DI
  695.     PUSH    SI
  696.     MOV    CX,4
  697.     REP    CMPSW
  698.     JZ    GOTSPEC
  699.     POP    SI
  700.     POP    DI
  701. LOOP2:    LODSB
  702.     OR    AL,AL
  703.     JNZ    LOOP2
  704.     MOV    AL,[SI]
  705.     OR    AL,AL
  706.     JNZ    LOOP1
  707.     MOV    AX,CS
  708.     MOV    DS,AX
  709.     MOV    DX,OFFSET MSG2
  710.     MOV    AH,9
  711.     INT    21H
  712.     INT    20H
  713. GOTSPEC:
  714.     POP    DI
  715.     POP    DI
  716.     MOV    DX,SI
  717.     MOV    BX,OFFSET PARBLK
  718.     MOV    AX,4B00H
  719.     INT    21H
  720.     MOV    AX,CS
  721.     MOV    SS,AX
  722.     MOV    SP,CS:STKPTR
  723.     MOV    DS,AX
  724.     MOV    ES,AX
  725.     POP    DX
  726.     MOV    AH,26
  727.     INT    21H
  728.     POP    BP
  729.     POP    DI
  730.     POP    SI
  731.     POP    DX
  732.     POP    CX
  733.     POP    BX
  734.     POP    AX
  735.     JMP    XCRLF
  736. SENDEM: LODSB
  737.     OR    AL,AL
  738.     JZ    NOSEND
  739.     STOSB
  740.     LOOP    SENDEM
  741. NOSEND: RET
  742. STKPTR    DW    ?
  743. MSG1    DB    'Unable to release memory.$'
  744. COMSPEC DB    'COMSPEC='
  745. MSG2    DB    'COMSPEC must be set$'
  746. PARBLK    DW    0,CMDLIN,?,FCB1,?,FCB2,?
  747. CMDLIN    DB    0,CR,0
  748. CMDBUF    DB    128
  749. CMDDTA    DB    0,CR,0,128 DUP(?)
  750. PREFMSG DB    ' /C '
  751. MSG4    DB    13,'Enter command for shell operation.',CR,LF,'*$'
  752. FCB1    DB    0,11 DUP('?'),25 DUP(0)
  753. FCB2    DB    0,11 DUP(' '),25 DUP (0)
  754. L0373    DB    5 DUP(0)
  755. ENDCODE DB    0
  756. LOCAL_STACK    EQU    ENDCODE+2048
  757. CODE    ENDS
  758.     END    START
  759. UP(0)
  760. FCB2    DB    0,11 DUP(' '),25 DUP (0)
  761. L0373    DB    5 DUP(0)
  762. ENDCODE DB    0
  763. LOCAL_STACK    EQU    ENDCODE+2048
  764. CODE    ENDS
  765.     END    ST